#ifndef Audio_H
#define Audio_H

#include <QObject>
#include <QTimer>

#include <QFile>
#include <QAudioRecorder>
#include <QUrl>

#include <bass.h>

#include <QDebug>
#include <QMessageBox>
#include <QProcess>
#include <QDir>
#include <cstdio>
#include <QLabel>

class Audio : public QObject
{
    Q_OBJECT

public:    

    bool os_windows;
    Audio();
    ~Audio() { BASS_Free(); }

    bool init();

    // Для текущего файла
    bool openFile(QString filename, bool repeat);
    void closeFile();

    QString getCurAsStr();
    QString getLenAsStr();

    int reqCurPos();   // Запрос текущей позиции
    int getLenInSec() { return length; }

    bool isPlaying() { return b_isPlaying; }
    bool isOpened()  { return b_isOpened;  }

    bool setRecordFile( QString filename );

    // Для получения данных из прочих файлов
    QStringList getLengthsOfFiles( QStringList fileNames);  // Для получения длин списка файлов
    QString     getLengthOfFile  ( QString     fileName);   // Для получения длины из одного файла

    QString sec2str( int seconds );

    bool convertFile( QString origFile, QString destFile);

protected:
    HSAMPLE  sample;
    HCHANNEL channel;

    QString recordFile; // Имя файла для записи
    QString openedFile; // Открытый для воспроизведения файл

    // Состояния
    bool b_isOpened;  // Файл открыт
    bool b_isPlaying;   // Файл воспроизводится

    // Variables
    int length;     // Длина файла
    int curPos;     // Текущая позиция

    // Длина файла строкой
    QString len_mins;   // Минуты как строка
    QString len_secs;   // Секунды как строка

    // Текущая позиция строкой
    QString cur_mins;
    QString cur_secs;

    // Для записи
    QFile *file;
    QAudioRecorder        *audioRecorder;
    QAudioEncoderSettings *encoderSettings;

    QString rec_currentFile;    // Показывает текущий записываемый файл

signals:
    void playStarted();
    void playPaused();
    void playStoped();
    void playEnded();

    void recordStarted();
    void recordStoped();


    // Signals for events with playing
public slots:
    void startPlay(bool repeat);
    void pausePlay();
    void stopPlay();
    void on_playEnded();

    bool startRecord(QString outputFile );
    void stopRecord();
};

#endif // Audio_H
